208. 架設sftp

事由

需要一個地方放大量的資料,日後提供給客戶下載,
本來想說用GCS就好,但如果要一次下載好幾個檔案就沒辦法了。
只好乖乖弄FTP。

正文

一開始用vsftp,搞個docker 大概沒10分鐘就好了。
有一半的時間在找image上面,
但如果要達成『一個使用者,可以看到所有使用者的目錄,其他使用者需要獨立』就懵了。

後續找資料時,看到鳥哥說了一句話,『所以,建議您,除非必要,否則的話,使用 SSH 提供的 sftp-server 功能即可』
ref. FTP 的安全性問題與替代方案

所以我就轉往sftp了。

先來釐清目標,

一個最高權限的帳號,
可以在所有使用者的目錄新增檔案,
然後所有使用者間是不能互相看到彼此的檔案。

docker image 使用 corilus/sftp
下載量已達1M。

如果只是簡單的ftp功能,直接架起來就好了。

但要做成上面的目標,要用mount的方式,將資料夾掛載到主目錄底下。
詳細作法參考下面。

docker-compose.yaml

version: '3'
services:
  sftp:
    container_name: sftp
    image: corilus/sftp
    privileged: true
    volumes:
        - ./mount.sh:/etc/sftp.d/bindmount.sh
        - ./userlist.conf:/etc/sftp/users.conf:ro
        - ./upload:/home
    ports:
        - "2222:22"
    restart: always

指令說明,可參考 108. linux shell 進階指令#^bdeaee
mount.sh

#!/bin/bash
# File mounted as: /etc/sftp.d/bindmount.sh
# Just an example (make your own)

function bindmount() {
    if [[ !  -d "$1" ]]; then
        mkdir -p "$1"
    fi

    if [[ ! -d "$2" ]]; then
	     mkdir -p "$2"
    fi

    chown -R :100 "$1" "$2"
    chmod 775 "$1" "$2"
    mount --bind "$1" "$2"
}

# Remember permissions, you may have to fix them:
# chown -R :users /data/common
bindmount "/home/mike/upload" "/home/ms/mike"
bindmount "/home/aaron/upload" "/home/ms/aaron"

userlist.conf

ms:ms:1001:100
mike:mike:1002:100
aaron:aaron:1003:100

本來想用ln的方式去操作,
從terminal 能夠進去資料夾,但用FTP登入就是說 no such file or dirctory

問了老半天GPT也都是失敗,
從一開始說要加個不存在的參數 FollowSymlinks ,
到後面的一連串重複回答。

最後看到 Symbolic link and filezilla over sftp
看來是ln的先天限制,所以改用mount後,調個權限,好了。

ref.